<?php
if (!defined('IN_SYS')) {
    header('HTTP/1.1 403 Forbidden');
    exit(0);
}

require_once './inc/random.inc.php';
require_once './inc/user.inc.php';

/** 
* AES加密类
* 
* 对openssl的一些封装
* @author xzqiapchu(www.xzzhangqiaochu.top)
* @version v1.0.0.200314_beta
*/
class Aes
{
    /**
    * 创建AES密钥
    * 
    * 生成密钥，保存，加密后下发
    * @param string $uid 用户id
    * @return string 通过密码MD5加密后的待传输消息
    */
    static function set($uid)
    {
        $aes = Random::getHex(16); //生成
        $_SESSION['aes'] = $aes; //保存
        $pwd = User::getPwd($uid);
        $aes_tmp = substr(md5($pwd), 0, 16); //用于传输AES密钥的密钥
        $iv = Random::getHex(16); //用于传输AES密钥的iv
        $aes_encrypt = openssl_encrypt($aes, 'AES-128-CBC', $aes_tmp, 0, $iv);
        $iv_with_aes_encrypt = $iv . $aes_encrypt;
        return $iv_with_aes_encrypt;
    }

    /**
    * 删除AES密钥
    *
    * 删除session中保存的AES密钥
    */
    static function del()
    {
        unset($_SESSION['aes']);
    }

    /**
    * AES加密
    *
    * 使用session里保存的AES密钥和随机生成的iv完成加密
    * 
    * @param string $text 待加密的字符串
    * @return string|false iv+AES加密的结果，返回false为加密失败
    */
    static function encrypt($text)
    {
        if (empty($_SESSION['aes']))
            return false; //session中的aes密钥不存在（调用此函数前请先写错误处理，此处再次判断以防程序报错）
        $aes = $_SESSION['aes'];
        $iv = Random::getHex(16);
        $encrypt_text = openssl_encrypt($text, 'AES-128-CBC', $aes, 0, $iv);
        $iv_with_encrypt_text = $iv . $encrypt_text;
        return $iv_with_encrypt_text;
    }

    /**
    * AES解密
    * 
    * 使用session里保存的AES密钥完成解密
    * 
    * @param string $iv_with_encrypt_text iv+AES密文
    * @return string|false AES解密的结果，返回false为解密失败
    */
    static function decrypt($iv_with_encrypt_text)
    {
        if (strlen($iv_with_encrypt_text) <= 17) //防止非法数据引发openssl报错
            return false;
        $encrypt_text = substr($iv_with_encrypt_text, 16);
        if (empty($_SESSION['aes']))
            return false; //session中的aes密钥不存在（调用此函数前请先写错误处理，此处再次判断以防程序报错）
        $aes = $_SESSION['aes'];
        $iv = substr($iv_with_encrypt_text, 0, 16);
        $text = openssl_decrypt($encrypt_text, 'AES-128-CBC', $aes, 0, $iv);
        return $text;
    }
}
